package com.yan.compute;

import java.util.Deque;
import java.util.LinkedList;
import java.util.Queue;

/**
 * @author taoge
 * @Date 2024/7/31 19:46
 * @Description 使用栈计算后缀表达式 2 3 5 + * 7 1 / + 4 -          中缀表达式 ：2*(3+5)+7/1-4
 * 中缀表达式：
 *    操作符以中缀形式位于运算数中间（如：3+2），是我们日常通用的算术和逻辑公式表示方法。
 * 后缀表达式：
 *    又称逆波兰式(Reverse Polish Notation - RPN)，操作符以后缀形式位于两个运算数后(如：3+2的后缀表达形式就是3 2 +)
 *
 * 中缀表达式往往需要使用括号将操作符和对应的操作数括起来，用于指示运算的次序
 * e.g：5*(2+1) 虽然 * 的优先级高于 +  ，但括号的存在表示应优先执行括号内的 + 运算。
 * 中缀表达式适合于人类的思维结构和运算习惯，但并不适用于计算机
 * 尤其是包含括号的中缀表达式，对计算机而言是非常复杂的结构。
 *
 * 适用于计算机的后缀表达式
 * 与中缀表达式不同，后缀表达式不需要使用括号来标识操作符的优先级。
 * 后缀表达式的计算按 操作符 从左到右出现的顺序依次执行(不考虑运算符之间的优先级)，对于计算机而言是比较简单的结构。
 *
 */
public class Compute {
    public static void main(String[] args) {
        Deque<Integer> deque = new LinkedList();
        System.out.println("计算结果为:");
        String str = "235+*71/+4-";
        char[] chars = str.toCharArray();
        for (int i = 0; i < chars.length; i++) {
            if (chars[i] >= '0' && chars[i] <= '9') {
                String temp = String.valueOf(chars[i]);
                Integer num = Integer.parseInt(temp);
                deque.push(num);
            } else if (chars[i] == '+') {
                Integer num1 = deque.poll();
                Integer num2 = deque.poll();
                deque.push(num2 + num1);
            } else if (chars[i] == '-') {
                Integer num1 = deque.poll();
                Integer num2 = deque.poll();
                deque.push(num2 - num1);
            } else if (chars[i] == '*') {
                Integer num1 = deque.poll();
                Integer num2 = deque.poll();
                deque.push(num2 * num1);
            } else if (chars[i] == '/') {
                Integer num1 = deque.poll();
                Integer num2 = deque.poll();
                deque.push(num2 / num1);
            }

        }
        Integer peek = deque.peek();
        System.out.println(peek);
    }

}
